package org.example.springprinciple.scope;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class ScopeController {

    //刚才找不到这个类型是因为引入的包出错了
    @Autowired
    private ApplicationContext context;

    @Autowired
    private Dog dog;

    @Autowired
    private Dog single;

    @Autowired
    private Dog prototype;

    @Autowired
    private Dog request;

    @Autowired
    private Dog session;

    @Autowired
    private Dog application;

    @RequestMapping("/getDog")
    public String  getDog() {
        return "dog:"+dog.toString()+",context:"+context.getBean("dog").toString();
    }

    @RequestMapping("/single")
    //这种情况跟上面是一样的，Bean默认的是一个单例模式
    public String  single() {
        return "dog:"+single.toString()+",context:"+context.getBean("single").toString();
    }

    @RequestMapping("/prototype")
    //来进行注入的时候，发现已经有了一个对象的时候
    //会另外再进行创建一个对象
    //导致会有多个对象
    public String  prototype() {
        return "dog:"+prototype.toString()+",context:"+context.getBean("prototype").toString();
    }

    @RequestMapping("/request")
    //这种情况默认的是一次请求的时候，对象是相同的。
    //不同的请求对象是不同的
    public String  request() {
        return "dog:"+request.toString()+",context:"+context.getBean("request").toString();
    }
    @RequestMapping("/session")
    //这个是不同会话之对象不同
    //看我们用什么来访问这个服务，比如使用不同的浏览器的时候，对象就不相同
    //试试使用postman来访问这个服务器
    //postman这里也相当于是一种客户端，不同的浏览器也是不同客户端，只要连上服务器的时候，就会产生不同的会话。
    public String  session() {
        return "dog:"+session.toString()+",context:"+context.getBean("session").toString();
    }

    @RequestMapping("/application")
    //这里相当于是一个web容器，一个web容器可以有多个应用
    //举个例子，相当于一个spring里面可以有多个tomcat，每一个tomcat是一个应用。
    public String  applicaton() {
        System.out.println("helle owrdl");
        return "dog:"+application.toString()+",context:"+context.getBean("application").toString();
    }
    //application scope 就是对于整个web容器来说的，bean的作用域是servletcontext级别，这个和singleton有点类似
    //区别在于：application scope是servletcntext的单例
    //singleton是一个applicationcontext的单例，在一个web容器中applicationcontext可以有很多个。

    //目前可以理解为
    //当一个springboot项目启动起来，可以包括很多项目
    //总体启动起来，就是一个servletcontext，而这一个中可以包括很多的applicationcontext
    //singleton是针对applicationcontext来说的。
}
